package com.pkche.core.advanced.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期工具类
 * 
 * 日期类型的工具类，该类均为静态方法，直接调用
 * 
 * 
 */
public class DateUtils {

	private static final SimpleDateFormat sdf = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");
	private static final SimpleDateFormat sdfSimple = new SimpleDateFormat(
			"yyyy-MM-dd");
	private static final SimpleDateFormat sdfFileName = new SimpleDateFormat(
			"yyyy-MM-dd HH_mm_ss");
	private static final SimpleDateFormat sdfDetail = new SimpleDateFormat(
			"yyyyMMddHHmmssSSS");
	
	private static final SimpleDateFormat sdfSimpleymd = new SimpleDateFormat(
			"yyyy年MM月dd日");
	private static final SimpleDateFormat sdf_yyMMdd = new SimpleDateFormat(
			"yyMMdd");

	/**
	 * 日期格式化模式（日期类型数据）
	 * 
	 * 日期格式化模式，使用此模式将日期格式化为“2012-10-08”，一般用于日期类型数据格式化
	 * 
	 */
	public static final String PATTERN_YYYY_MM_DD = "yyyy-MM-dd";
	
	public static final String PATTERNS_YYYY_MM_DD = "yyyy年MM月dd日";
	
	/**
	 * 日期格式化模式（时间类型数据）
	 * 
	 * 日期格式化模式，使用此模式将日期格式化为“2012-10-08 10:10:08”，一般用于时间类型数据格式化
	 * 
	 */
	public static final String PATTERN_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

	/**
	 * 根据特定模式，将字符串型日期对象解析成Date对象
	 * 
	 * @param source
	 *            要解析的字符串
	 * @param pattern
	 *            解析模式，默认为{@value #PATTERN_YYYY_MM_DD_HH_MM_SS}
	 * @return 解析结果
	 * @throws java.text.ParseException
	 *             如果要解析的字符串格式不匹配，则抛出此异常
	 */
	public static Date parse(String source, String pattern)
			throws ParseException {
		// 检查value是否为空
		if (source == null) {
			return null;
		}
		// 如果pattern为空
		if (pattern == null) {
			// 设置pattern为PATTERN_YYY_MM_DD_HH_MM_SS
			pattern = PATTERN_YYYY_MM_DD_HH_MM_SS;
		}
		// 初始化一个format类
		SimpleDateFormat format = new SimpleDateFormat(pattern);
		// 开始解析
		return format.parse(source);
	}

	/**
	 * 将日期对象根据特定格式格式化成字符串
	 * 
	 * @param source
	 *            要格式化的日期对象
	 * @param pattern
	 *            格式化模式，默认为{@value #PATTERN_YYYY_MM_DD_HH_MM_SS}
	 * @return 格式化后的字符串
	 */
	public static String format(Date source, String pattern) {
		// 检查value是否为空
		if (source == null) {
			return null;
		}
		// 如果pattern为空
		if (pattern == null) {
			// 设置pattern为PATTERN_YYYY_MM_DD_HH_MM_SS
			pattern = PATTERN_YYYY_MM_DD_HH_MM_SS;
		}
		// 初始化一个format类
		SimpleDateFormat format = new SimpleDateFormat(pattern);
		return format.format(source);
	}

	/**
	 * 按 {@value #PATTERN_YYYY_MM_DD}格式格式化日期对象
	 * 
	 * @param source
	 *            日期对象
	 * @return 格式化值
	 */
	public static String format(Date source) {
		return format(source, PATTERN_YYYY_MM_DD);
	}
	/**
	 * 格式化年月日
	 * @param source
	 * @return
	 */
	public static String formats(Date source) {
		return format(source, PATTERNS_YYYY_MM_DD);
	}

	/**
	 * 将日期对象格式化成特定格式字符串
	 * 
	 * @param source
	 *            日期对象
	 * @param isFullPattern
	 *            格式化类型，true{@value #PATTERN_YYYY_MM_DD_HH_MM_SS}类型，false
	 *            {@value #PATTERN_YYYY_MM_DD}类型
	 * @return 格式化后的值
	 */
	public static String format(Date source, boolean isFullPattern) {
		// PATTERN_YYYY_MM_DD_HH_MM_SS 格式
		if (isFullPattern) {
			return format(source, PATTERN_YYYY_MM_DD_HH_MM_SS);
		}
		// PATTERN_YYYY_MM_DD 格式
		else {
			return format(source);
		}
	}

	/**
	 * 返回服务器时间
	 * 
	 * @return
	 */
	public static Date getServerDate() {
		return new Date();
	}

	/**
	 * 
	 * 日期转字符串
	 */
	public static synchronized String dateToString(Date date) {

		return (date == null || "".equals(date.toString())) ? "" : sdf
				.format(date);

	}

	/**
	 * 
	 * 日期转字符串
	 */
	public static synchronized String dateToStringSimple(Date date) {

		return (date == null || "".equals(date.toString())) ? "" : sdfSimple
				.format(date);

	}

	/**
	 * 
	 * 获得当前时间
	 */
	public static String getCurrentDate() {

		return sdfFileName.format(new Date());

	}
	/**
	 * 
	 * 获得当前日期2013年7月26日
	 */
	public static String getCurrentDateToDay() {

		return sdfSimpleymd.format(new Date());

	}

	/**
	 * 
	 * 获得当前时间(包含毫秒)
	 */
	public static String getDetailTime() {

		return sdfDetail.format(new Date());

	}

	/**
	 * 
	 * 查询日期
	 */
	public static synchronized Date getDate(Date date, int value) {

		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DAY_OF_MONTH, value);
		return cal.getTime();

	}

	/**
	 * 
	 * 字符串转时间
	 */
	public static synchronized Date strToDate(String str) throws Exception {

		return sdfSimple.parse(str);

	}

	/**
	 * 按 {@value #PATTERN_YYYY_MM_DD}格式格式化日期对象
	 * 
	 * @param source
	 *            日期对象
	 * @return 格式化值
	 */
	public static String format(Object obj) {
		SimpleDateFormat format = new SimpleDateFormat(
				PATTERN_YYYY_MM_DD_HH_MM_SS);
		if (obj == null)
			return "";
		return format.format(obj);
	}
	
	/**
	 * 把毫秒转换为日期字符串
	 * @param millis 毫秒数
	 * @return
	 */
	public static String getDateTimeByMillisecond(Long millis) {
		Date date = new Date(millis);
		SimpleDateFormat format = new SimpleDateFormat(PATTERN_YYYY_MM_DD_HH_MM_SS);
		String time = format.format(date);
		return time;
	}
	
	/**
	 * 把毫秒转换为年+月+日+小时+分+秒
	 * @param millis
	 * @return
	 */
	public static String convertMillis(Long millis){
		/*String y = "年";
		String m = "月";
		String d = "天";
		String h = "小时";
		String mi = "分";
		String ms = "秒";*/
		if(millis<=0l)
			return "";
		Long d = 24*60*60*1000l;
		Long h = 60*60*1000l;
		Long mi = 60*1000l;
		Long ms = 1000l;
		long day = millis/d;
		long hour = millis%d/h;
		long min = millis%d%h/mi;
		long sec = millis%d%h%mi/ms;
		return day+"天"+hour+"小时"+min+"分钟"+sec+"秒";
	}

	/**
	 * 计算两个日期相差的天数 日期类型需为：yyyy-MM-dd
	 * 
	 * @param startTime
	 * @param endTime
	 * @return
	 * @throws java.text.ParseException
	 */
	public static long divideDay(String startTime, String endTime)
			throws ParseException {
		SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
		Date date1 = ft.parse(endTime);
		Date date2 = ft.parse(startTime);
		long quot = date1.getTime() - date2.getTime();
		quot = quot / 1000 / 60 / 60 / 24;
		return quot;
	}

	/**
	 * 得到下一个日期
	 * 
	 * @param date
	 * @param day
	 * @return
	 * @throws java.text.ParseException
	 */
	public static Date nextDays(Date date, long day) throws ParseException {

		long time = date.getTime();
		time += 1000 * 24 * 60 * 60 * day;
		Date date1 = new Date(time);
		return date1;
	}

	public static String dayForWeek(String pTime) throws Exception {
		String[] weeks = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };

		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		Calendar c = Calendar.getInstance();
		c.setTime(format.parse(pTime));
		int dayForWeek = 0;
		if (c.get(Calendar.DAY_OF_WEEK) == 1) {
			dayForWeek = 7;
		} else {
			dayForWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
		}
		return weeks[dayForWeek - 1];
	}
	
	/** 
     * 计算两个日期之间相差的天数 
     * @param smdate 较小的时间
     * @param bdate  较大的时间
     * @return 相差天数
	 * @throws java.text.ParseException
     */  
    public static int daysBetween(Date smdate,Date bdate) throws ParseException  
    {  
    	SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
    	smdate=sdf.parse(sdf.format(smdate));
    	bdate=sdf.parse(sdf.format(bdate));
        Calendar cal = Calendar.getInstance();  
        cal.setTime(smdate);  
        long time1 = cal.getTimeInMillis();               
        cal.setTime(bdate);  
        long time2 = cal.getTimeInMillis();       
        long between_days=(time2-time1)/(1000*3600*24);
          
       return Integer.parseInt(String.valueOf(between_days));         
    }  
    
    
    /** 
     * 计算从20140401到现在的天数
     * @return 相差天数
	 * @throws java.text.ParseException
     */  
    public static int daysBetween20140401() 
    {  
    	Calendar date20140401 = Calendar.getInstance();
    	date20140401.set(Calendar.YEAR, 2014);
    	date20140401.set(Calendar.MONTH, 3);//月份从0  1 2 3 计算
    	date20140401.set(Calendar.DAY_OF_MONTH, 1);
        long time1 = date20140401.getTimeInMillis();               
        long time2 = Calendar.getInstance().getTimeInMillis();       
        long between_days=(time2-time1)/(1000*3600*24);
       return Integer.parseInt(String.valueOf(between_days));         
    }
    
    /**
     * 传入一个pressdate 获取到对应的日期
     * @param pressDate
     * @return
     */
    public static Date dayIn20140401(Integer pressDate){
    	Calendar date20140401 = Calendar.getInstance();
    	date20140401.set(Calendar.YEAR, 2014);
    	date20140401.set(Calendar.MONTH, 3);
    	date20140401.set(Calendar.DAY_OF_MONTH, 1);
    	date20140401.add(Calendar.DATE, pressDate);
    	return date20140401.getTime();
    }
    
    /**
     * 获取当前时间以yyyy-MM-dd HH:mm:ss格式显示的时间
     * @return String
     */
    public static String getNowyyyy_MM_dd_HH_mm_ss(){
    	return format(Calendar.getInstance().getTime(), true);
    }
    
    /**
     * 获取当前以yyMMdd格式显示的日期
     * @return String
     */
    public static String getNowyyMMdd(){
    	return sdf_yyMMdd.format(Calendar.getInstance().getTime());
    }
    
    public static String getMonth_ch(String month) {
    	String[] month_ch = {"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"};
    	return month_ch[Integer.parseInt(month) - 1];
    }
}
